package tk.mybatis.simple.proxy;

import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.List;

/**
 * 使用Java动态代理方式创建一个代理类
 * @author: tianhao.luo@hand-china.com 2021/3/18  14:26
 */
public class MyMapperProxy<T> implements InvocationHandler {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyMapperProxy.class);

    /**
     * mapper对象
     * 被代理的主要对象
     */
    private Class<T> mapperInterface;
    /**
     * sqlSession
     * 用来执行mapper中的接口
     */
    private SqlSession sqlSession;


    public MyMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) {
        this.mapperInterface = mapperInterface;
        this.sqlSession = sqlSession;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("====================进入代理方法==========================");
        // 针对不同的sql类型，需要调用sqlSession不同的方法
        // 接口方法中的参数也有很多情况，这里只考虑没有参数的情况
        List<T> list = sqlSession.selectList(mapperInterface.getName() + "." + method.getName());
        System.out.println("====================代理方法执行完毕==========================");
        return list;
    }
}
